<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        // 回调地狱   不方便维护与扩展
        // try ...catch... 异常难于捕获
        // 同步并发代码，执行完毕时间不确定

        // promise A+规范定义 定义了相关的行为

        //es6中的promise也是A+规范的实现
        var p = new Promise((resolve, reject) => {
            setTimeout(() => {
                resolve();
            }, 5000);
        });

        // p.then(() => {
        //     console.log("Got it");
        // })
        console.log(p);
        // 1.
        // pending 进行中
        // fufilled（resovle） 已成功
        // reject 已失效
        // 对象的状态不受外界影响
        // 2.状态的不可逆性
        // promise固化后，在对promise对象添加回调，是可以直接拿到这个结果
        // 如果说是事件的话,一旦错过,就是真的错过了

        // reject可以捕获异常
        let promise = new Promise(function (resolve, reject) {
            setTimeout(function () {
                console.log(Math.random() * 100 > 60);
                Math.random() * 100 > 60 ? resolve('ok') : reject('no')
            }, 30)
        })
        // promise.then((val) => {
        //     console.log(val);
        //     return val;//return出的值以供后面.then调用
        // }, (reason) => {
        //     console.log(reason);
        //     return reason
        // }).then((val) => {
        //     console.log(val);
        // }, (reason) => {
        //     console.log(reason);
        // })

        //catch会捕获失败
        // 冒泡的特性
        // 状态固化之后无法捕获
        // then(),没有参数,会直接忽略
        promise.then((val) => {
            console.log(val);
            return val;//return出的值以供后面.then调用
        }).catch((reason) => {
            console.log(reason + '  ' + 'reason');
            return reason
        })

        // 当一个promise对象A返回状态依赖于另一个promise对象B,promise对象A的状态无效,完全取决于promise对象B


        // Promise.all([])
        // 当一个失败就返回失败，只有全部成功才是成功
         function promisify(func){
            return function(...arg){
                return new Promise((resolve,reject)=>{
                    func(...arg,(err,data)=>{
                        if(err){
                            reject(err);
                        }else{
                            resolve(data)
                        }
                    })
                })
            }
         }
    </script>
</body>

</html>